﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//int main()
//{
//
//	char ch[80] = "123abcdEFG*&";
//	int j;
//	puts(ch);
//
//}

//int dominantIndex(int* nums, int numsSize) {
//    int i = 0;
//    int max = *nums;
//    int x = 0;
//    for (i = 0; i < numsSize; i++)
//    {
//        if (*(nums + i) > max)
//        {
//            max = *(nums + i);
//            x = i;
//        }
//            
//    }
//    int j = 0;
//    for (j = 0; j < numsSize; j++)
//    {
//        if (*(nums + j) != 0)
//        {
//            if ((max / *(nums + j)) >= 2)
//            {
//                return x;
//            }
//        }
//    }
//    return -1;
//}

//int main1()
//{
//	int nums[4] = { 3,6,1,0 };
//	int numsSize = 4;
//	int ret = dominantIndex(nums, numsSize);
//	printf("%d\n", ret);
//		
//}





//int intersection_word[1001] = { 0 };
//int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
//    int check[1001] = { 0 };
//    int i = 0;
//    int j = 0;
//    int set = 0;
//    for (i = 0; i < nums1Size; i++)
//    {
//        for (j = 0; j < nums2Size; j++)
//        {
//            if (*(nums1 + i) == *(nums2 + j))
//            {
//                check[set] = *(nums1 + i);
//                set++;
//                break;
//            }
//        }
//    }
//    //重复出现次数
//    int count = 0;
//    if (set > 1)
//    {
//        for (i = 0; i < set - 1; i++)
//        {
//            for (j = i+1; j < set; j++)
//            {
//                if (check[i] == check[j] && check[i] != 1001)
//                {
//                    check[j] = 1001;
//                }
//            }
//        }
//    }
//    for (i = 0; i < set; i++)
//    {
//        if (check[i] != 1001)
//        {
//            intersection_word[count] = check[i];
//            count++;
//        }
//    }
//    *returnSize = count;
//    return intersection_word;
//}
//
//int main2()
//{
//    int num1[] = { 61,24,20,58,95,53,17,32,45,85,70,20,83,62,35,89,5,95,12,86,58,77,30,64,46,13,5,92,67,40,20,38,
//        31,18,89,85,7,30,67,34,62,35,47,98,3,41,53,26,66,40,54,44,57,46,70,60,4,63,82,42,65,59,17,98,29,72,1,96,
//        82,66,98,6,92,31,43,81,88,60,10,55,66,82,0,79,11,81 };
//    int num2[] = { 5,25,4,39,57,49,93,79,7,8,49,89,2,7,73,88,45,15,34,92,84,38,85,34,16,6,99,0,2,36,68,52,73,50,77,44,61,
//        48 };
//    int returnSize = 0;
//    int size1 = sizeof(num1) / sizeof(num1[0]);
//    int size2 = sizeof(num2) / sizeof(num2[0]);
//    int* ret = intersection(num1, size1, num2, size2, &returnSize);
//    int i = 0;
//    for (i = 0; i < returnSize; i++)
//    {
//        printf("%d ", intersection_word[i]);
//    }
//}

//int main3()
//{
//	int arr[5] = { 1,5,7,3,2 };
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 4; i++)
//	{
//		for (j = 0; j < 4-i; j++)
//		{
//			int tmp = 0;
//			if (arr[j] >= arr[j + 1])
//			{
//				tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//			}
//
//		}
//	}
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}

//int pivotIndex(int* nums, int numsSize) {
    /*
    
    int i = 0;
    for (i = 0; i < numsSize; i++)
    {
        int j = 0;
        int sum = 0;
        if (i == 0)
        {
            for (j = i + 1; j < numsSize; j++)
            {
                sum += *(nums + j);
            }
            if (sum == 0)
                return i;
        }
        else if (i < numsSize - 1)
        {
            int k = 0;
            int sum_left = 0;
            int sum_right = 0;
            for (k = 0; k < i; k++)
            {
                sum_left += *(nums + k);
            }
            for (j = numsSize - 1; j > i; j--)
            {
                sum_right += *(nums + j);
            }
            if (sum_left == sum_right)
            {
                return i;
            }
        }
        else
        {
            sum = 0;
            for (j = numsSize - 2; j >= 0; j--)
            {
                sum += *(nums + j);
            }
            if (sum == 0)
            {
                return i;
            }
        }
    }
    return -1;
    */
    //奇妙解法
    // int left_sum = 0;
    // int total_sum = 0;
    // int i = 0;
    // for (i=0; i<numsSize; i++)
    // {
    //     total_sum += *(nums+i);
    // }
    // for (i=0; i<numsSize; i++)
    // {
    //     if (left_sum == total_sum - left_sum - *(nums+i))
    //         return i;
    //     left_sum += *(nums+i);
    // }
    // return -1;
//}
//
//int main()
//{
//    int nums[] = {2,1,-1 };
//    int sz = sizeof(nums) / sizeof(nums[0]);
//    int ret = pivotIndex(nums, sz);
//    printf("%d\n", ret);
//}

//int main()
//{
//    char c[5] = { 'a', 'b', '\0', 'c', '\0' };
//    printf("%s", c);
//}

//#include <stdio.h>
//
//int main() {
//    char a[501] = { 0 };
//    scanf("%s", a);
//    char* str = a;
//    int count = 0;
//    char b[501] = { 0 };
//    int i = 0;
//    while (*str != '\0')
//    {
//        for (i = 0; i <= count; i++)
//        {
//            if (b[i] == *str)
//                break;
//
//            if (b[i] == 0)
//            {
//                count++;
//                b[i] = *str;
//                break;
//            }
//
//        }
//
//        str++;
//    }
//    printf("%d\n", count);
//    return 0;
//}


//原来字符存进内存是ASCALL所以可以看成整数
//int main()
//{
//    int a['a'] = { 49,50,51 };
//    for (int i = 0; i < 3; i++)
//    {
//        printf("%d\n", a[i]);
//    }
//}


/*
给定一个大小为 n 的数组 nums ，返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的，并且给定的数组总是存在多数元素。



示例 1：

输入：nums = [3,2,3]
输出：3
示例 2：

输入：nums = [2,2,1,1,1,2,2]
输出：2

*/

//标准答案与我的答案:
/*
int majorityElement(int* nums, int numsSize) {
    // int n = numsSize / 2;
    // int b[100001] = { 0 };
    // int i = 0;
    // int j = 0;
    // int count = 0;
    // for (i=0; i<numsSize; i++)
    // {
    //     for (j=0; j <=2*i+1; j+=2)
    //     {
    //         if (b[j] != *(nums+i) && b[j] == 0)
    //         {        b[j] = *(nums+i);
    //                 b[j+1] += 1;
    //         }
    //         else if (b[j] == *(nums+i))
    //         {
    //             b[j+1] += 1;
    //         }
    //     }
    // }
    // for (j = 1; j<=2*numsSize+1; j+=2)
    // {
    //     if (b[j] > n)
    //     {
    //         return b[j-1];
    //     }
    // }
    // return 0;
    int cut = 0;
    int j = 0;
    for (int i = 0; i < numsSize; i++)
    {
        if (cut == 0)
        {
            j = *(nums+i);
        }
     
        if (*(nums+i) == j)
        {
            cut++;
        }
        else
            cut--;
    }
    return j;
}
*/
//int majorityElement(int* nums, int numsSize) {
//    int n = numsSize / 2;
//    int i = 0;
//    for (i = 0; i < numsSize - 1; i++)
//    {
//        int j = 0;
//        for (j = 0; j < numsSize - 1 - i; j++)
//        {
//            int tmp = 0;
//            if (*(nums + j) > *(nums + j + 1))
//            {
//                tmp = *(nums + j);
//                *(nums + j) = *(nums + j + 1);
//                *(nums + j + 1) = tmp;
//            }
//        }
//    }
//    int count = 0;
//    for (i = 0; i < numsSize; i++)
//    {
//        if (count <= n)
//        {
//            if (*(nums + i) == *(nums + i + 1))
//            {
//                count++;
//            }
//            else
//            {
//                count = 0;
//            }
//        }
//        else
//        {
//            return count;
//        }
//    }
//}
//
//int main()
//{
//    int nums[] = { 3,2,3 };
//    int numsSize = sizeof(nums) / sizeof(nums[0]);
//    int ret = majorityElement(nums, numsSize);
//    printf("%d\n", ret);
//}

//int a[10000] = { 0 };
////是自处数返回1,不是返回0
//int check(int n)
//{
//    int num = 0;
//    int num1 = n;
//    while (num1)
//    {
//        num = num1 % 10;
//        if (n % num != 0)
//            return 0;
//        num1 /= 10;
//    }
//    return 1;
//}
//
//int* selfDividingNumbers(int left, int right, int* returnSize) {
//    int i = 0;
//    int count = 0;
//    for (i = left; i <= right; i++)
//    {
//        //检查是否是自除数
//        if (i%10 != 0 && check(i))
//        {
//            a[count] = i;
//            count++;
//        }
//    }
//    *returnSize = count;
//    return a;
//}
//
//int main()
//{
//    int returnSize = 0;
//    int* ret = selfDividingNumbers(1, 22, &returnSize);
//    int i = 0;
//    for (i = 0; i < returnSize; i++)
//    {
//        printf("%d ", a[i]);
//    }
//}

//int answer[100000] = { 0 };
//int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
//    int i = 0;
//    int left[100000] = { 0 };
//    int right[100000] = { 0 };
//    //求左缀之积
//    for (i = 0; i < numsSize; i++)
//    {
//        if (i == 0)
//            left[i] = 1;
//        else
//        {
//            left[i] = nums[i - 1] * left[i - 1];
//        }
//    }
//    //求右缀之积
//    for (i = numsSize - 1; i >= 0; i--)
//    {
//        if (i == numsSize - 1)
//            right[i] = 1;
//        else
//        {
//            right[i] = nums[i + 1] * left[i + 1];
//        }
//    }
//    //两个相乘赋给answer
//    for (i = 0; i < numsSize; i++)
//    {
//        answer[i] = left[i] * right[i];
//    }
//    *returnSize = numsSize;
//    return answer;
//}
//
//int main()
//{
//    int arr[100000] = { 0 };
//    int* p = arr;
//    int nums[4] = { 1,2,3,4 };
//    int returnsize = 0;
//    p = productExceptSelf(nums, 4, &returnsize);
//    return 0;
//}

//2_15

//int func(int x)
//{
//    int count = 0;
//    while (x)
//    {
//        count++;
//        x = x & (x - 1);//与运算
//    }
//    return count;
//}
//
//int main()
//{
//    int ret = func(-1);
//    printf("%d\n", ret);
//}

//int main()
//{
//    int n = 0;
//    if (n = 0)
//        printf("hehe\n");
//}

/*
0000 0110 -3 = num1
0000 0101 -5 = num2
1遍
num1 = num1 ^ num2 = 0000 0011
num2 = (temp & num2) << 1 = 0000 0100
2遍
0000 0011 - num1
0000 0100 - num2
num1 = num1 ^ num2 = 0000 0111 
                     0000 0100 - num2
num2 = (tmp & num2) << 1 = 0000 0100 = 0000 1000
*/

